const fs = require('fs')

function getFileByPath(fpath) {
    var promise = new Promise(function (resolve, reject) {

        fs.readFile(fpath, 'utf-8', (err, dataStr) => {

            if (err) return reject(err)
            resolve(dataStr)
        })
    })
    return promise
}

// 先读取文件1，再读取2，最后读取3
// 注意：通过.then 指定回调函数的时候，成功的回调函数必须穿，但是，失败的回调，可以不传
// 下面这个还是回调地狱
// var p = getFileByPath('./files/1.txt')
// p.then(function (data) {
//     console.log(data + '----')
//     var p = getFileByPath('./files/2.txt')
//     p.then(function (data) {
//         console.log(data + '----')
//         var p = getFileByPath('./files/3.txt')
//         p.then(function (data) {
//             console.log(data + '----')
//         })
//     })
// })

// 利用Promise的.then ,在这里返回了一个新的promise实例，可以继续使用下一个.then
// getFileByPath('./files/11.txt')
// .then(function(data){
//     console.log(data)

//     return getFileByPath('./files/2.txt')
// },function(err){
//     console.log('我失败了'+'----'+err.message)
//     return getFileByPath('./files/2.txt')
// })
// .then(function(data){
//     console.log(data)

//     return getFileByPath('./files/3.txt')
// })
// .then(function(data){
//     console.log(data)
// })


// 当我们 有这样的需求时：哪怕前面的Promise执行失败了，
// 但是，不要影响后续promise的正常执行，此时，我们可以
// 单独为每个promise，通过.then指定一下失败的回调

// 有时候，我们这样的需求，和上面的需求完全相反；
// 如果后续的promise执行，依赖于前面Promise执行的结果，
// 如果前面的失败了，则后面的就没有执行下去的意义了，此时
// 我们想要实现，一旦有报错，就停止所有promise执行

getFileByPath('./files/11.txt')
.then(function(data){
    console.log(data)

    return getFileByPath('./files/2.txt')
})
.then(function(data){
    console.log(data)

    return getFileByPath('./files/3.txt')
})
.then(function(data){
    console.log(data)
})
.catch(function(err){ //catch 的作用：如果前面有任何Promise执行失败
    // 则立即终止所有promise的执行，并 马上进入catch去处理Promise中抛出的异常
    console.log(err.message)
})